package com.colorlight.cloud.complete.entity.po;

import com.colorlight.cloud.gateway.api.annotation.defaultValue;
import com.colorlight.cloud.gateway.api.annotation.percent;
import com.colorlight.cloud.gateway.api.message.constraint.basics.object.Trans;
import com.colorlight.iot.proto.complete.entity.CompleteEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PowerAndTempInfo implements Trans<PowerAndTempInfo, CompleteEntity.PowerAndTempInfo> {

    /**
     * 电压，后3位作为小数点后的值
     */
    @percent
    private Float voltage;

    /**
     * 外部电压
     */
    private List<ExternalVoltage> externalVoltage;

    /**
     * 电池电压，后3位作为小数点后的值
     */
    @percent
    private Float batteryVoltage;

    /**
     * 灯板温度，后3位作为小数点后的值
     */
    @percent
    private Float boardTemperature;

    /**
     * 接收卡温度，后3位作为小数点后的值，-9999表示无温度传感器
     */
    @defaultValue
    @percent
    private Float temperature;

    /**
     * 误码率，需要除以1_000_000来获取实际误码率
     */
    private Double errorRate;

    /**
     * 排线是否正常
     */
    private Boolean cableOK;

    /**
     * 风扇集合
     */
    private List<FanInfo> fanInfo;

    /**
     * 电源集合
     */
    private List<PowerInfo> powerInfo;

    /**
     * 是否是备份卡
     */
    private Boolean isBackupCard;

    /**
     * 箱体门是否打开
     */
    private Boolean boxDoorOpen;

    /**
     * 湿度,后3位作为小数点后的值  -9999表示无湿度传感器
     */
    @defaultValue
    @percent
    private Float humidity;

    /**
     * 是否存在烟雾，true存在
     */
    private Boolean smokeDetected;

    @Override
    public PowerAndTempInfo formProto(CompleteEntity.PowerAndTempInfo powerAndTempInfo) {
        PowerAndTempInfo powerAndTempInfoResult = Trans.super.formProto(powerAndTempInfo);
        // 误码率 真实数据为 传输值/10^6
        if(powerAndTempInfoResult != null && powerAndTempInfoResult.getErrorRate() != null){
            BigDecimal errorRateBig = BigDecimal.valueOf(powerAndTempInfoResult.getErrorRate());
            powerAndTempInfoResult.setErrorRate(errorRateBig.divide(new BigDecimal("1000000.0"), errorRateBig.scale() + 6, RoundingMode.HALF_UP).doubleValue());
        }
        return powerAndTempInfoResult;
    }
}

